/**
 * 防抖函数
 * @param fn 需要防抖的函数
 * @param delay 延迟时间（毫秒）
 * @param immediate 是否立即执行
 * @returns 经过防抖处理的函数
 */
export function debounce<Args extends unknown[], R>(
  fn: (...args: Args) => R,
  delay = 300,
  immediate = false,
): (...args: Args) => void {
  let timer: NodeJS.Timeout | null = null
  let isInvoked = false

  return function (this: unknown, ...args: Args) {
    // 如果是立即执行且从未执行过
    if (immediate && !isInvoked) {
      fn.apply(this, args)
      isInvoked = true
      return
    }

    // 清除之前的定时器
    if (timer) clearTimeout(timer)

    // 设置新的定时器
    timer = setTimeout(() => {
      fn.apply(this, args)
      isInvoked = false
    }, delay)
  }
}

// 使用示例：
/*
import { debounce } from '@/utils/debounce';

// 在组件中使用
const handleSearch = debounce((value: string) => {
  console.log('搜索:', value);
}, 500);

// 或者在setup中使用
const debouncedFn = debounce(() => {
  // 你的代码
}, 300, true);
*/
